#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e5+1000;
typedef long long LL;
inline LL read(){LL x=0,f=1;char ch=getchar();	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;}
struct P{
    LL x,y;
}a[maxn];
int main(void){
   	cin.tie(0);std::ios::sync_with_stdio(false);
    LL n;cin>>n;
    for(LL i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
    }
    LL mxx=1,mxy=1,mnx=1,mny=1;
    for(LL i=1;i<=n;i++){
        if(a[i].x>a[mxx].x) mxx=i;
        if(a[i].y>a[mxy].y) mxy=i;
        if(a[i].x<a[mnx].x) mnx=i;
        if(a[i].y<a[mny].y) mny=i;
    }
    set<LL>s={mxx,mxy,mnx,mny};
    set<pair<LL,LL>>si;
    vector<LL>v;

    for(auto j:s){
        for(LL i=1;i<=n;i++){
            if(!si.count({i,j})){
                v.push_back(max(abs(a[j].x-a[i].x),abs(a[j].y-a[i].y)));
                si.insert({i,j});
                si.insert({j,i});
            }
        }
    }
    sort(v.begin(),v.end());
    reverse(v.begin(),v.end());
    cout<<v[1]<<"\n";
   	return 0;
}
